/**
 * 
 */
package br.idez.idezJet.control.beans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ValueChangeEvent;
import javax.validation.Valid;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.primefaces.component.datatable.DataTable;

import br.idez.idezJet.control.util.FacesUtil;
import br.idez.idezJet.integracao.vo.Usuario;
import br.idez.idezJet.negocio.service.UsuarioService;

/**
 * @author Moacir Junior
 * 
 */

@ManagedBean
@RequestScoped
public class UsuarioBean extends IdezJetBean {

	@EJB
	private UsuarioService usuarioService;
	@Valid
	private Usuario usuario;
	@Email(message = "{email.invalido}")
	@NotEmpty(message = "{campo.nulo}")
	private String email2;
	@NotEmpty(message = "{campo.nulo}")
	private String senha2;
	private String tipoDoc;
	private Boolean renderedCpf;
	private Boolean renderedRg;

	private List<Usuario> usuariosaRemover;

	private HtmlInputText inputTextCartaoMilhas;
	private DataTable datatable;
	private HtmlSelectOneMenu comboBoxTipoDoc;

	public UsuarioBean() {
		usuario = new Usuario();
		usuariosaRemover = new ArrayList<Usuario>();
		renderedCpf = false;
		renderedRg = false;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getEmail2() {
		return email2;
	}

	public void setEmail2(String email2) {
		this.email2 = email2;
	}

	/**
	 * @return the senha2
	 */
	public String getSenha2() {
		return senha2;
	}

	/**
	 * @param senha2
	 *            the senha2 to set
	 */
	public void setSenha2(String senha2) {
		this.senha2 = senha2;
	}

	public String getTipoDoc() {
		return tipoDoc;
	}

	public void setTipoDoc(String tipoDoc) {
		this.tipoDoc = tipoDoc;
	}

	public HtmlInputText getInputTextCartaoMilhas() {
		return inputTextCartaoMilhas;
	}

	public void setInputTextCartaoMilhas(HtmlInputText inputTextCartaoMilhas) {
		this.inputTextCartaoMilhas = inputTextCartaoMilhas;
	}

	public boolean isRenderedCpf() {
		return comboBoxTipoDoc != null ? (((String) comboBoxTipoDoc.getValue()) != null && !((String) comboBoxTipoDoc
				.getValue()).trim().equals("RG"))
				: (renderedCpf != null ? this.renderedCpf : false);
	}

	public void setRenderedCpf(Boolean renderedCpf) {
		this.renderedCpf = renderedCpf;
	}

	public boolean isRenderedRg() {
		return comboBoxTipoDoc != null ? (((String) comboBoxTipoDoc.getValue()) != null && !((String) comboBoxTipoDoc
				.getValue()).trim().equals("CPF"))
				: (renderedRg != null ? this.renderedRg : false);
	}

	public void setRenderedRg(boolean renderedRg) {
		this.renderedRg = renderedRg;
	}

	public List<Usuario> getUsuariosaRemover() {
		return usuariosaRemover;
	}

	public void setUsuariosaRemover(List<Usuario> usuariosaRemover) {
		this.usuariosaRemover = usuariosaRemover;
	}

	public DataTable getDatatable() {
		return datatable;
	}

	public void setDatatable(DataTable datatable) {
		this.datatable = datatable;
	}

	public HtmlSelectOneMenu getComboBoxTipoDoc() {
		return comboBoxTipoDoc;
	}

	public void setComboBoxTipoDoc(HtmlSelectOneMenu comboBoxTipoDoc) {
		this.comboBoxTipoDoc = comboBoxTipoDoc;
	}

	public List<String> getTipoDocumento() {
		List<String> itens = new ArrayList<String>();

		itens.add("RG");
		itens.add("CPF");

		return itens;
	}

	public void trocaTipoDocumento(AjaxBehaviorEvent evt) {
		HtmlSelectOneMenu comboBox = (HtmlSelectOneMenu) evt.getSource();

		this.renderedCpf = (((String) comboBox.getValue()) != null && !((String) comboBox
				.getValue()).trim().equals("RG"));
		this.renderedRg = (((String) comboBox.getValue()) != null && !((String) comboBox
				.getValue()).trim().equals("CPF"));

		FacesContext.getCurrentInstance().renderResponse();
	}

	public String cadastrarUsuario() {
		try {
			usuarioService.incluir(this.usuario);
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.inclusao");
			return null;
		}
		registrarSucessoInclusao();
		return "listarUsuarios";
	}

	public String editarUsuario() {
		try {
			usuarioService.alterar(this.usuario);
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.alteracao");
			return null;
		}
		registrarSucessoAlteracao();
		return "listarUsuarios";
	}

	public List<Usuario> getUsuarios() {
		List<Usuario> listaUsuario = null;
		try {
			listaUsuario = (List<Usuario>) usuarioService.listar();
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.listar");
			return null;
		}
		return listaUsuario;
	}

	public void gerarNumCartaoMilha() {
		this.usuario.setNumCartaoMilhas(100000000 + (long) (999999999 * Math
				.random()));
		inputTextCartaoMilhas.setValue(usuario.getNumCartaoMilhas());
		System.out.println(inputTextCartaoMilhas.getValue());
		FacesContext.getCurrentInstance().renderResponse();
	}

	public String remover() {
		this.usuario = (Usuario) datatable.getRowData();
		try {
			usuarioService.excluir(this.usuario);
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.exclusao");
			return null;
		}
		registrarSucessoExclusao();
		return null;
	}

	public String removerSelecionados() {
		try {
			usuarioService.excluirUsuarios(usuariosaRemover);
		} catch (Exception e) {
			FacesUtil.registrarErro("erro.exclusao");
			return null;
		}
		registrarSucessoExclusao();
		return null;
	}

	public String prepararEdicao() {
		this.usuario = (Usuario) datatable.getRowData();
		this.email2 = usuario.getEmail();
		this.renderedCpf = this.usuario.getCpf() == null ? false : true;
		this.renderedRg = this.usuario.getRg() == null ? false : true;
		return "editarUsuario";
	}

	public void checkboxMudou(ValueChangeEvent event) {

		Boolean selecionado = (Boolean) event.getNewValue();

		Usuario usuarioRecebido = (Usuario) this.datatable.getRowData();

		if (selecionado) {
			this.usuariosaRemover.add(usuarioRecebido);
			return;
		}
		this.usuariosaRemover.remove(usuarioRecebido);
	}
}
